<?php

class Cache_Manager extends Zend_Cache_Manager implements ISingleton
{
	/**
	 * Отдельный конфигурационный файл для кеша.
	 * 
	 * @var Zend_Config
	 */
	protected $_config;
	
	/**
	 * Отдельный backend, который используется на всем проекте.
	 * 
	 * @var Zend_Cache_Backend
	 */
	protected $_backend;
	
	/**
	 * Объект кеширования полных страниц, хранится тут для возможности отмены кеширования в случае ошибки.
	 * 
	 * @var Zend_Cache_Frontend_Page
	 */
	protected $_frontendPage;
	
    /**
     * @var Cache_Manager
     */
    protected static $instance = null;

    function  __construct() {
        $config = new Config_Ini(BASE_DIR . '/config/config_cache.ini');
        $this->_config = $config;
       
        
        $backend = $config->cache_backend;
        if (!$backend->enable) {
        	$this->_backend = new Zend_Cache_Backend_BlackHole();
        	return ;
        }
        
        $class = $backend->class;
        $this->_backend = new $class($backend->options->toArray());
    }
    
    /**
     * Возвращает объект конфигурации для кэша.
     */
    public function getConfig()
    {
    	return $this->_config;
    }
    
    /**
     * Возвращает объект, кеширующий странички полностью. Использует config_cache.ini
     * 
     * @return Zend_Cache_Frontend_Page
     */
    public function getPage()
    {
    	if ($this->_frontendPage) {
    		return $this->_frontendPage;
    	}
    	
		$config = $this->_config;
		$options = $config->cache_frontend_page;
		if (!$options->enable) {
			return false;
		}
		
		$options = $options->toArray();
		
		foreach ($options['rules'] as $rule) {
			$options['regexps'][$rule] = array('cache' => true);
		}
		
		$frontend = new Cache_Frontend_Page($options);
		$frontend->setBackend($this->getBackend());
		$this->_frontendPage = $frontend;
		return $frontend;
    }
    
    /**
     * Возвращает backend, настроенный в конфиге.
     * 
     * @return Cache_Backend_Memcached
     */
    public function getBackend()
    {
    	return $this->_backend;
    }

    /**
     * @return Cache_Manager
     */
    public static function getInstance()
    {
        if (self::$instance === null) {
            self::$instance = new self();
        }
        
        return self::$instance;
    }

    /**
     * @todo Realize logger
     * Called from a backend profiler.
     *
     * @param float $dt         Time spent in calling.
     * @param string $method    Called method name.
     * @return void
     */
    public function _profile($dt, $method)
    {
    	return ;
        RuntimeStat::getInstance()->incParam(RuntimeStat::MMQ, 1);
        RuntimeStat::getInstance()->incParam(RuntimeStat::MMT, $dt);
    }
}
